package src.BlueBridge.DeepRecursion;

import java.util.Scanner;

/**
    有一个N*M的园子，雨后积了水，八连通的积水被认为是连接在一起的，叫作一个水洼，请求出
    园子里总共有多少水洼(八连通指的是图中相对W的*部分)
        ***
        *W*
        ***
    样例:
    输入:
    N=10，M=12
    园子如下图:('W'表示积水，'.'表示没有积水)

        W........WW.
        .WWW.....WWW
        ....WW...WW.
        .........WW.
        .........W..
        ..W......W..
        .W.W.....WW.
        W.W.W.....W.
        .W.W......W.
        ..W.......W.

     输出:
     3
 */

public class _10水洼数 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int M = sc.nextInt();
        char[][] a = new char[N][];
        for (int i = 0 ; i < N ; i++) {
            a[i] = sc.nextLine().toCharArray();
        }
        int count = 0;
        for (int i = 0 ; i < N ; i++) {
            for (int j = 0 ; j < M ; j++) {
                if (a[i][j] == 'W') {
                    dfs(a, i, j);
                    count++;
                }
            }
        }
        System.out.println(count); // 3
    }

    public static void dfs(char[][] a, int i, int j) {
        // 先把该积水的位置换成无水，以免互相转移状态造成死循环
        // 也即走过一个，
        a[i][j] = '.';

//        if (i > 0 && a[i - 1][j] == 'W') // 上方
//            dfs(a, i - 1, j);
//        if (i < a.length - 1 && a[i + 1][j] == 'W') // 下方
//            dfs(a, i - 1, j);
//        if (i > 0 && a[i - 1][j] == 'W')
//            dfs(a, i - 1, j);
//        if (i > 0 && a[i - 1][j] == 'W')
//            dfs(a, i - 1, j);
//        if (i > 0 && a[i - 1][j] == 'W')
//            dfs(a, i - 1, j);
//        if (i > 0 && a[i - 1][j] == 'W')
//            dfs(a, i - 1, j);
//        if (i > 0 && a[i - 1][j] == 'W')
//            dfs(a, i - 1, j);
//        if (i > 0 && a[i - 1][j] == 'W')
//            dfs(a, i - 1, j);

        // 上述算法书写过于麻烦
        for (int k = -1 ; k < 2 ; k++) {// -1,0,1
            for (int l = -1 ; l < 2 ; l++) {// -1,0,1
                // 把自己本身去掉
                if (k == 0 && l == 0)
                    continue;
                if (i + k >= 0 && i + k <= a.length - 1 && j + l >= 0 && j + l <= a[0].length - 1) {
                    if (a[i + k][j + l] == 'W') {
                        dfs(a, i + k, j + l);
                    }
                }
            }
        }
        /*
        经典:八个方向，八个状态，扣掉自己，反复记忆
        for (int k = -1 ; k < 2 ; k++) {// -1,0,1
            for (int l = -1 ; l < 2 ; l++) {// -1,0,1
                // 把自己本身去掉
                if (k == 0 && l == 0)
                    continue;
                if (i + k >= 0 && i + k <= a.length - 1 && j + l >= 0 && j + l <= a[0].length - 1) {
                    if (a[i + k][j + l] == 'W') {
                        dfs(a, i + k, j + l);
                    }
                }
            }
        }
        */
    }
}
